import gradio as gr
import requests
import json
import os
from dotenv import load_dotenv

# 加载环境变量（优先从.env文件读取，其次从系统环境变量）
load_dotenv()
API_KEY = os.getenv("DASHSCOPE_API_KEY", "sk-e3cd69d802ad4110a8111a7f2e13cf5c")
API_URL = "https://dashscope.aliyuncs.com/api/v1/services/aigc/text-generation/generation"

# 加载典故知识库
def load_allusion_kb():
    kb_path = "./data/allusions/allusion_kb.json"
    if os.path.exists(kb_path):
        with open(kb_path, "r", encoding="utf-8") as f:
            return json.load(f)
    # 默认知识库（无文件时使用）
    return [
        {"keyword": "沉舟侧畔千帆过", "name": "沉舟侧畔", "content": "出自刘禹锡《酬乐天扬州初逢席上见赠》，比喻新生事物必然战胜旧事物"},
        {"keyword": "己所不欲", "name": "己所不欲，勿施于人", "content": "出自《论语》，指自己不愿意的事情，不要强加给别人"},
        {"keyword": "先天下之忧", "name": "先天下之忧而忧", "content": "出自范仲淹《岳阳楼记》，体现心怀天下的政治抱负"}
    ]

allusion_kb = load_allusion_kb()

# 通义大模型调用函数
def call_tongyi_model(prompt, temperature=0.7, max_tokens=1024):
    """调用通义大模型API生成响应"""
    if not API_KEY or API_KEY.startswith("sk-"):
        headers = {
            "Authorization": f"Bearer {API_KEY}",
            "Content-Type": "application/json"
        }
    else:
        headers = {
            "Authorization": f"Bearer sk-{API_KEY}",
            "Content-Type": "application/json"
        }
    
    payload = {
        "model": "qwen-turbo",  # 通义千问 turbo 模型
        "input": {
            "messages": [
                {"role": "system", "content": "你是一个专业的文学助手，精通中国传统文化和历史人物研究"},
                {"role": "user", "content": prompt}
            ]
        },
        "parameters": {
            "result_format": "message",
            "temperature": temperature,
            "max_tokens": max_tokens
        }
    }
    
    try:
        response = requests.post(API_URL, headers=headers, json=payload, timeout=30)
        response.raise_for_status()
        result = response.json()
        return result["output"]["choices"][0]["message"]["content"].strip()
    except requests.exceptions.RequestException as e:
        return f"模型调用失败：{str(e)}"
    except Exception as e:
        return f"响应解析失败：{str(e)}"

def cross_time_chat(ancient_figure, user_input):
    """跨时空对话功能：与古人智能体交互"""
    # 构建人物设定提示词
    figure_prompts = {
        "孔子": "你是孔子，儒家学派创始人，说话温和而有哲理，常用比喻和反问阐述观点，回复需符合《论语》风格",
        "李白": "你是李白，唐代浪漫主义诗人，性格豪放，语言充满想象力，回复需带诗词韵味",
        "苏轼": "你是苏轼，北宋文学家，豁达乐观，回复兼具文采和生活气息，可引用其诗词",
        "李清照": "你是李清照，宋代女词人，情感细腻，语言清丽，回复需体现婉约词风",
        "范仲淹": "你是范仲淹，北宋政治家，心怀天下，回复需体现忧国忧民的情怀"
    }
    
    prompt = f"""
    {figure_prompts.get(ancient_figure, "你是一位历史名人，回复需符合你的身份和时代背景")}
    用户问：{user_input}
    请以{ancient_figure}的身份回应，保持语言风格一致，不要暴露现代身份。
    """
    return call_tongyi_model(prompt, temperature=0.8, max_tokens=1024)

def text_interpretation(text):
    """文本解读功能：文言文/诗词深度解析"""
    prompt = f"""
    请从以下三个方面深度解读文本：
    1. 字面翻译：准确翻译原文意思
    2. 背景故事：介绍作者、创作背景及相关典故
    3. 情感内涵：分析文本表达的情感和思想
    
    文本：{text}
    """
    interpretation = call_tongyi_model(prompt, temperature=0.6, max_tokens=1024)
    
    # 补充关联典故
    for allusion in allusion_kb:
        if allusion["keyword"] in text:
            interpretation += f"\n\n【关联典故】{allusion['name']}\n{allusion['content']}"
    
    return interpretation

def ancient_modern_application(cultural_theme):
    """古为今用功能：传统文化现代场景应用"""
    prompt = f"""
    请将"{cultural_theme}"这一传统文化智慧应用到现代生活场景，提供具体的：
    1. 职场应用建议
    2. 人际交往启示
    3. 个人成长指导
    
    要求结合实际案例，建议具体可行，体现传统文化的现代价值。
    """
    return call_tongyi_model(prompt, temperature=0.7, max_tokens=1024)

# 构建Gradio界面
with gr.Blocks(title="文枢智语——跨时空文学交互平台", theme=gr.themes.Soft()) as demo:
    gr.Markdown(
        """
        # 文枢智语——跨时空文学交互平台
        ### 北邮You-Hack AI应用挑战赛参赛作品  
        基于通义大模型打造的传统文化智能交互平台
        """
    )
    
    with gr.Row(equal_height=True):
        with gr.Column(scale=1):
            gr.Image("./static/logo.png", height=150, visible=False)  # 若有logo可启用
            gr.Markdown("""
            **三大核心功能：**  
            • 与历史名人跨时空对话  
            • 文言文/诗词深度解读  
            • 传统文化智慧现代应用  
            """)
        with gr.Column(scale=3):
            with gr.Tab("📜 跨时空对话"):
                ancient_figure = gr.Dropdown(
                    choices=["孔子", "李白", "苏轼", "李清照", "范仲淹"],
                    label="选择历史人物",
                    value="孔子"
                )
                user_input = gr.Textbox(
                    label="输入你的问题/话题",
                    placeholder="例如：孔子先生，如何理解“仁”的思想？",
                    lines=2
                )
                chat_output = gr.Textbox(label="古人回应", lines=8)
                chat_btn = gr.Button("发送", variant="primary")
                chat_btn.click(cross_time_chat, inputs=[ancient_figure, user_input], outputs=chat_output)
            
            with gr.Tab("📖 文本深度解读"):
                text_input = gr.Textbox(
                    label="输入文言文/诗词",
                    placeholder="例如：沉舟侧畔千帆过，病树前头万木春",
                    lines=2
                )
                interpret_output = gr.Textbox(label="解读结果", lines=10)
                interpret_btn = gr.Button("解读", variant="primary")
                interpret_btn.click(text_interpretation, inputs=text_input, outputs=interpret_output)
            
            with gr.Tab("🌐 古为今用"):
                cultural_theme = gr.Dropdown(
                    choices=["己所不欲，勿施于人", "先天下之忧而忧", "道法自然", "学而不思则罔", "知行合一"],
                    label="选择文化主题",
                    value="己所不欲，勿施于人"
                )
                application_output = gr.Textbox(label="现代应用建议", lines=8)
                application_btn = gr.Button("生成建议", variant="primary")
                application_btn.click(ancient_modern_application, inputs=cultural_theme, outputs=application_output)

# 启动应用（适配GitCode Space）
if __name__ == "__main__":
    demo.launch(
        server_name="0.0.0.0",
        server_port=7860,
        share=False,
        inbrowser=False
    )